Closed
Conversation
… where they have access to
…d class merging conflicts
…e value, fixes #994
…d dashboard reporting table
…ProjectDropdown; fix e2e
…reduce visual complexity
…m inconsistencies The frontend did not show organization settings for admin users because of the team ownership check
columns in the project table
add request classes and fix collection typing for clients, tasks and tags
this is a trade-off where for non grid aligned entries, the cursor position is a bit off, but data and visual are stil in sync. otherwise fc overrides height on drag, causing flickers.
the synced snapDuration cause incorrect noops on updates f.e. 15:55-16:00 on a 15 minute snap
Added a warning about AI slop pull requests and potential bans.
Contributor
There was a problem hiding this comment.
Pull request overview
This PR rolls up the v0.11.0 feature work, including a shift toward TanStack Query on the frontend, new sortable/persisted table UX, and faster/sharded Playwright E2E execution, plus backend filter/pagination improvements.
Changes:
- Migrate multiple pages/components from Pinia store fetching to TanStack Query hooks and refactor UI form fields to the shared
Field/*components. - Add client/member/tag/project table sorting (incl. persisted sort state via storage) and several UI/UX polish changes (select/tabs/dialog/table styling).
- Improve E2E reliability/performance (API-based auth, Mailpit helpers, sharded CI runs with Octane/FrankenPHP) and enhance backend filtering/validation/pagination ordering.
Reviewed changes
Copilot reviewed 201 out of 387 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| resources/js/Pages/ProjectShow.vue | Switch to query-based data sources; format billable rate via computed. |
| resources/js/Pages/Profile/Partials/UpdateProfileInformationForm.vue | Replace legacy label/error components with new Field components. |
| resources/js/Pages/Profile/Partials/UpdatePasswordForm.vue | Replace legacy label/error components with new Field components. |
| resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue | Replace legacy label/error components with new Field components. |
| resources/js/Pages/Profile/Partials/ThemeForm.vue | Replace native select with shared Select UI components. |
| resources/js/Pages/Profile/Partials/LogoutOtherBrowserSessionsForm.vue | Update error handling UI to Field components. |
| resources/js/Pages/Profile/Partials/DeleteUserForm.vue | Update error handling UI to Field components. |
| resources/js/Pages/Profile/Partials/ApiTokensForm.vue | Update token form to Field components and improve helper text structure. |
| resources/js/Pages/Members.vue | Persist member table sort state and forward sorting events/props. |
| resources/js/Pages/Dashboard.vue | Adjust dashboard grid spacing. |
| resources/js/Pages/Clients.vue | Switch client fetching to query hook; persist and forward table sorting state. |
| resources/js/Pages/Auth/TwoFactorChallenge.vue | Update auth form UI to Field components. |
| resources/js/Pages/Auth/ResetPassword.vue | Update auth form UI to Field components. |
| resources/js/Pages/Auth/Register.vue | Update auth form UI to Field components; refactor checkbox alignment. |
| resources/js/Pages/Auth/Login.vue | Update auth form UI to Field components. |
| resources/js/Pages/Auth/ForgotPassword.vue | Update auth form UI to Field components. |
| resources/js/Pages/Auth/ConfirmPassword.vue | Update auth form UI to Field components. |
| resources/js/Pages/API/Partials/ApiTokenManager.vue | Update token manager fields to Field components. |
| resources/js/Components/ui/tabs/TabsList.vue | Update TabsList styling classes. |
| resources/js/Components/ui/select/SelectTrigger.vue | Expand SelectTrigger API (sizes/variants/chevron) and restyle. |
| resources/js/Components/ui/number-field/NumberFieldInput.vue | Update number input sizing/typography classes. |
| resources/js/Components/ui/label/index.ts | Export new Label component entrypoint. |
| resources/js/Components/ui/label/Label.vue | Add Label wrapper component around reka-ui Label. |
| resources/js/Components/ui/dropdown-menu/DropdownMenuContent.vue | Adjust dropdown-menu content border styling classes. |
| resources/js/Components/ui/dialog/DialogContent.vue | Improve dialog layout/padding and pointer-events handling. |
| resources/js/Components/ui/calendar/CalendarDateInput.vue | Switch Popover import source; adjust Button props. |
| resources/js/Components/ui/calendar/CalendarCellTrigger.vue | Update selected day styling classes. |
| resources/js/Components/ui/button/index.ts | Remove old button exports/variants from this UI path. |
| resources/js/Components/ui/button/Button.vue | Remove old Button component implementation from this UI path. |
| resources/js/Components/TimeTracker.vue | Move time-entry flow toward query/mutation hooks; UI tweaks. |
| resources/js/Components/ResponsiveNavLink.vue | Enable Inertia Link prefetch. |
| resources/js/Components/NavigationSidebarLink.vue | Enable Inertia Link prefetch. |
| resources/js/Components/NavLink.vue | Enable Inertia Link prefetch on mount. |
| resources/js/Components/DropdownLink.vue | Enable Inertia Link prefetch. |
| resources/js/Components/Dashboard/ThisWeekOverview.vue | Add reporting table; adjust chart options and query stale times. |
| resources/js/Components/Dashboard/TeamActivityCardEntry.vue | Adjust activity entry spacing and typography. |
| resources/js/Components/Dashboard/TeamActivityCard.vue | Improve empty-state padding behavior. |
| resources/js/Components/Dashboard/RecentlyTrackedTasksCardEntry.vue | Switch to query hooks; adjust entry styling; tweak start/stop button. |
| resources/js/Components/Dashboard/RecentlyTrackedTasksCard.vue | Update icons and empty-state spacing. |
| resources/js/Components/Dashboard/LastSevenDaysCard.vue | Tighten typing for placeholder data construction. |
| resources/js/Components/Dashboard/DayOverviewCardEntry.vue | Adjust day row styling and simplify classes. |
| resources/js/Components/Dashboard/DayOverviewCardChart.vue | Simplify chart axes and remove unused styling variables. |
| resources/js/Components/Dashboard/DashboardCard.vue | Adjust card layout/styling and spacing. |
| resources/js/Components/CurrentSidebarTimer.vue | Apply secondary variant to timer start/stop. |
| resources/js/Components/ConfirmsPassword.vue | Update error display UI to Field components. |
| resources/js/Components/Common/User/UserTimezoneMismatchModal.vue | Replace custom modal logic with shared TimezoneMismatchModal. |
| resources/js/Components/Common/Task/TaskTableHeading.vue | Restyle task table headings. |
| resources/js/Components/Common/Task/TaskMultiselectDropdown.vue | Switch to tasks query; add empty label and submit event passthrough. |
| resources/js/Components/Common/Task/TaskEditModal.vue | Refactor task edit modal form to FieldGroup/Field. |
| resources/js/Components/Common/Task/TaskCreateModal.vue | Refactor task create modal form; customize project trigger UI. |
| resources/js/Components/Common/Tag/TagTableRow.vue | Add edit flow (modal) and permission-aware options. |
| resources/js/Components/Common/Tag/TagTableHeading.vue | Add sortable header UI with chevrons. |
| resources/js/Components/Common/Tag/TagTable.vue | Switch tag fetching to query; add frontend sorting via vue-table. |
| resources/js/Components/Common/Tag/TagMoreOptionsDropdown.vue | Add edit option and permission checks. |
| resources/js/Components/Common/Tag/TagEditModal.vue | Add modal for editing tag name. |
| resources/js/Components/Common/TableHeading.vue | Adjust heading typography sizing. |
| resources/js/Components/Common/TabBar/TabBarItem.vue | Adjust tab item padding/classes. |
| resources/js/Components/Common/Reporting/ReportingTabNavbar.vue | Refactor reporting tabs; add hover prefetch and dynamic tab list. |
| resources/js/Components/Common/Reporting/ReportingRow.vue | Add optional cost column support and nested-row layout changes. |
| resources/js/Components/Common/Reporting/ReportingRoundingControls.vue | Switch popover import; refactor rounding UI to Field components; button variant change. |
| resources/js/Components/Common/Reporting/ReportingGroupBySelect.vue | Replace legacy dropdown/badge with shared Select UI. |
| resources/js/Components/Common/Reporting/ReportingExportButton.vue | Replace legacy dropdown with dropdown-menu components. |
| resources/js/Components/Common/Reporting/ReportingChart.vue | Simplify chart axis rendering. |
| resources/js/Components/Common/Report/ReportTableRow.vue | Add created/expiry columns with localized formatting and visibility icons. |
| resources/js/Components/Common/Report/ReportTableHeading.vue | Update report table headings to match new columns. |
| resources/js/Components/Common/Report/ReportTable.vue | Update report table grid columns and empty-state colspan. |
| resources/js/Components/Common/Report/ReportEditModal.vue | Use Field components; fix public_until UTC/local conversion. |
| resources/js/Components/Common/Report/ReportCreateModal.vue | Use Field components; invalidate reports query; navigate after create. |
| resources/js/Components/Common/ProjectMember/ProjectMemberTableRow.vue | Switch member lookup to query hook. |
| resources/js/Components/Common/ProjectMember/ProjectMemberTableHeading.vue | Restyle project-member headings. |
| resources/js/Components/Common/ProjectMember/ProjectMemberMoreOptionsDropdown.vue | Switch member lookup to query hook. |
| resources/js/Components/Common/ProjectMember/ProjectMemberEditModal.vue | Refactor billable rate label to Field components. |
| resources/js/Components/Common/Project/constants.ts | Add shared sentinel constant for “no client”. |
| resources/js/Components/Common/Project/ProjectsFilterDropdown.vue | Add dropdown-based project filter UI for status/client. |
| resources/js/Components/Common/Project/ProjectTableRow.vue | Switch clients/tasks to query hooks; adjust status display/icons. |
| resources/js/Components/Common/Project/ProjectTableHeading.vue | Add sortable header UI with chevrons. |
| resources/js/Components/Common/Project/ProjectStatusFilterBadge.vue | Add status filter badge component with dropdown options. |
| resources/js/Components/Common/Project/ProjectMultiselectDropdown.vue | Switch to projects query; add empty label and submit passthrough. |
| resources/js/Components/Common/Project/ProjectEditModal.vue | Refactor modal to FieldGroup; update client trigger UI; switch clients to query. |
| resources/js/Components/Common/Project/ProjectClientFilterBadge.vue | Add client filter badge component with dropdown checklist. |
| resources/js/Components/Common/Project/BaseFilterBadge.vue | Add reusable filter badge UI with dropdown and remove action. |
| resources/js/Components/Common/PageTitle.vue | Adjust icon sizing for page titles. |
| resources/js/Components/Common/Member/MemberTableRow.vue | Update status icons and remove unnecessary fetch on modal open. |
| resources/js/Components/Common/Member/MemberTableHeading.vue | Add sortable header UI with chevrons. |
| resources/js/Components/Common/Member/MemberTable.vue | Switch to members query; implement frontend sorting via vue-table. |
| resources/js/Components/Common/Member/MemberRoleSelect.vue | Replace legacy dropdown/badge with shared Select UI. |
| resources/js/Components/Common/Member/MemberMultiselectDropdown.vue | Switch member list to query hook and add submit passthrough. |
| resources/js/Components/Common/Member/MemberMergeModal.vue | Invalidate members query after merge. |
| resources/js/Components/Common/Member/MemberMakePlaceholderModal.vue | Invalidate members query after placeholder conversion. |
| resources/js/Components/Common/Member/MemberInviteModal.vue | Refactor invite form UI to Field components. |
| resources/js/Components/Common/Member/MemberDeleteModal.vue | Refactor delete confirmation UI to Field components; invalidate members query. |
| resources/js/Components/Common/Member/MemberBillableSelect.vue | Replace legacy dropdown/badge with shared Select UI. |
| resources/js/Components/Common/Invitation/InvitationTableHeading.vue | Restyle invitation table headings. |
| resources/js/Components/Common/Client/ClientTableRow.vue | Switch projects to query hook; adjust status UI/icons. |
| resources/js/Components/Common/Client/ClientTableHeading.vue | Add sortable header UI with chevrons. |
| resources/js/Components/Common/Client/ClientTable.vue | Add frontend sorting via vue-table; compute project counts for sorting. |
| resources/js/Components/Common/Client/ClientMultiselectDropdown.vue | Switch client list to query hook; add empty label and submit passthrough. |
| resources/js/Components/Common/Client/ClientCreateModal.vue | Refactor create modal label to Field components. |
| resources/js/Components/CommandPalette/index.ts | Export command palette provider. |
| playwright/fixtures.ts | Add API-based auth, ctx/admin/employee fixtures, and user setup helpers. |
| playwright/config.ts | Add Mailpit URL and central test password constant. |
| playwright.config.ts | Configure higher parallelism and blob reports; CI-only Firefox project. |
| package.json | Add workspaces; bump frontend dependencies; add postcss-import. |
| e2e/utils/tags.ts | Convert Page import to type-only. |
| e2e/utils/table.ts | Add helper to extract ordered row names from tables. |
| e2e/utils/money.ts | Convert NumberFormat import to type-only. |
| e2e/utils/mailpit.ts | Add Mailpit API helpers for invitation/reset link extraction. |
| e2e/utils/currentTimeEntry.ts | Improve visibility targeting and assertions for timer interactions. |
| docker-compose.yml | Bump Playwright container image version. |
| database/factories/UserFactory.php | Use class import in @see annotation. |
| config/excel.php | Import DefaultValueBinder and reference it by class name. |
| config/auth.php | Import User and reference by class name. |
| config/audit.php | Import resolver classes and reference by class name. |
| config/app.php | Import providers and reference by class name. |
| composer.json | Require PHP 8.4.*. |
| bootstrap/app.php | Add imports and replace fully-qualified class references. |
| app/Service/TimeEntryService.php | Fix rounding “Up” end boundary behavior. |
| app/Service/TimeEntryFilter.php | Add NONE sentinel and support “none” filtering across dimensions. |
| app/Service/ReportExport/CsvExport.php | Use imported exception types in docblock. |
| app/Service/MemberService.php | Ensure placeholder user gets current_team_id set. |
| app/Service/Dto/ReportPropertiesDto.php | Allow “none” sentinel in properties ID collections. |
| app/Service/DashboardService.php | Constrain weekly billable amount by organization. |
| app/Policies/OrganizationPolicy.php | Use PermissionStore for organization update authorization. |
| app/Models/Organization.php | Adjust findOrFail return type to Team import. |
| app/Http/Resources/V1/Tag/TagCollection.php | Implement PaginatedResourceCollection. |
| app/Http/Resources/V1/Client/ClientCollection.php | Implement PaginatedResourceCollection. |
| app/Http/Requests/V1/TimeEntry/TimeEntryUpdateRequest.php | Restrict project existence validation by employee visibility rules. |
| app/Http/Requests/V1/TimeEntry/TimeEntryUpdateMultipleRequest.php | Restrict project existence validation by employee visibility rules. |
| app/Http/Requests/V1/TimeEntry/TimeEntryStoreRequest.php | Restrict project existence validation by employee visibility rules. |
| app/Http/Requests/V1/TimeEntry/TimeEntryIndexRequest.php | Allow “none” sentinel in ID filters via custom validators. |
| app/Http/Requests/V1/TimeEntry/TimeEntryIndexExportRequest.php | Add client_ids export filter rules and “none” sentinel validation. |
| app/Http/Requests/V1/TimeEntry/TimeEntryAggregateRequest.php | Allow “none” sentinel in aggregate filter IDs via custom validators. |
| app/Http/Requests/V1/TimeEntry/TimeEntryAggregateExportRequest.php | Allow “none” sentinel in aggregate-export filter IDs via custom validators. |
| app/Http/Requests/V1/Task/TaskIndexRequest.php | Add page parameter validation. |
| app/Http/Requests/V1/Tag/TagIndexRequest.php | Add Tag index request with page validation. |
| app/Http/Requests/V1/Report/ReportStoreRequest.php | Allow “none” sentinel in stored report properties IDs. |
| app/Http/Requests/V1/Report/ReportIndexRequest.php | Add Report index request with page validation. |
| app/Http/Requests/V1/ProjectMember/ProjectMemberIndexRequest.php | Add ProjectMember index request with page validation. |
| app/Http/Requests/V1/Member/MemberMergeIntoRequest.php | Adjust rule return-type annotation import. |
| app/Http/Requests/V1/Member/MemberIndexRequest.php | Add page parameter validation. |
| app/Http/Requests/V1/Invitation/InvitationIndexRequest.php | Add page parameter validation. |
| app/Http/Middleware/RedirectIfAuthenticated.php | Update docblock type annotation. |
| app/Http/Middleware/ForceJsonResponse.php | Update docblock type annotation. |
| app/Http/Middleware/ForceHttps.php | Update docblock type annotation. |
| app/Http/Kernel.php | Add imports and replace fully-qualified middleware references. |
| app/Http/Controllers/Api/V1/TimeEntryController.php | Simplify Carbon typehint by importing Carbon. |
| app/Http/Controllers/Api/V1/TaskController.php | Add deterministic ordering for task pagination. |
| app/Http/Controllers/Api/V1/TagController.php | Use TagIndexRequest for index endpoint. |
| app/Http/Controllers/Api/V1/ReportController.php | Use ReportIndexRequest; allow updating public_until when public. |
| app/Http/Controllers/Api/V1/ProjectMemberController.php | Add index request, ordering, and pagination for members. |
| app/Http/Controllers/Api/V1/ProjectController.php | Add deterministic ordering for project pagination. |
| app/Http/Controllers/Api/V1/MemberController.php | Add deterministic ordering for member pagination. |
| app/Http/Controllers/Api/V1/InvitationController.php | Add deterministic ordering for invitation pagination. |
| app/Http/Controllers/Api/V1/ChartController.php | Increase days returned for daily tracked hours chart. |
| app/Http/Controllers/Api/V1/ApiTokenController.php | Add ordering for API tokens list. |
| app/Filament/Resources/UserResource.php | Use imported Filament form components (TextInput). |
| app/Filament/Resources/TimeEntryResource/Pages/EditTimeEntry.php | Map member_id to user_id/organization_id on save. |
| app/Filament/Resources/TimeEntryResource/Pages/CreateTimeEntry.php | Map member_id to user_id/organization_id on create. |
| app/Filament/Resources/TimeEntryResource.php | Use member selector; add task_id selection; simplify table column classes. |
| app/Filament/Resources/ReportResource.php | Use imported Filament components in form/table. |
| app/Filament/Resources/OrganizationResource/RelationManagers/UsersRelationManager.php | Use imported Filament table actions/columns. |
| app/Filament/Resources/OrganizationResource.php | Use imported Filament components in form/table. |
| app/Filament/Resources/OrganizationInvitationResource.php | Use imported Filament Select component. |
| app/Filament/Resources/FailedJobResource.php | Fix Textarea component class name casing. |
| README.md | Add contribution guidance line regarding AI-generated PR quality. |
| .github/workflows/playwright.yml | Add sharded Playwright runs, Mailpit service ports, Octane server, and report merging. |
| .env.ci | Switch CI mailer to SMTP for Mailpit and set Octane server environment. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| <slot /> | ||
| <SelectIcon as-child> | ||
| <ChevronDown class="w-4 h-4 opacity-50 shrink-0" /> | ||
| <SelectIcon v-if="showChevron" as-child> |
Comment on lines
+154
to
+164
| $includeNone = in_array(self::NONE_VALUE, $clientIds, true); | ||
| $clientIds = array_values(array_filter($clientIds, fn (string $id): bool => $id !== self::NONE_VALUE)); | ||
|
|
||
| $this->builder->where(function (Builder $builder) use ($clientIds, $includeNone): void { | ||
| if (count($clientIds) > 0) { | ||
| $builder->whereIn('client_id', $clientIds); | ||
| } | ||
| if ($includeNone) { | ||
| $builder->orWhereNull('client_id'); | ||
| } | ||
| }); |
Comment on lines
+41
to
+42
| class="py-1.5 pr-3 text-left text-text-tertiary pl-4 sm:pl-6 lg:pl-8 3xl:pl-12 cursor-pointer hover:bg-secondary hover:text-text-primary transition-colors select-none flex items-center gap-1" | ||
| @click="handleSort('name')"> |
| </DropdownMenuContent> | ||
| </DropdownMenu> | ||
|
|
||
| <button |
| request: APIRequestContext, | ||
| query: string | ||
| ): Promise<{ messages: Array<{ ID: string; Subject: string }> }> { | ||
| const response = await request.get(`${MAILPIT_BASE_URL}/api/v1/search?query=${query}`); |
| style="grid-template-columns: 1fr 150px 150px"> | ||
| :class="showCost ? 'col-span-3' : 'col-span-2'" | ||
| class="grid bg-tertiary" | ||
| :style="`grid-template-columns: 1fr 150px ${showCost ? '150px' : ''}`"> |
| <TabBarItem value="detailed" @click="router.visit(route('reporting.detailed'))" | ||
| >Detailed</TabBarItem | ||
| > | ||
| <TabBar :default-value="props.active" @update:model-value="onTabChange"> |
| - name: "Install FrankenPHP" | ||
| run: | | ||
| ARCH="$(uname -m)" | ||
| curl -fsSL "https://github.com/dunglas/frankenphp/releases/latest/download/frankenphp-linux-${ARCH}" -o /usr/local/bin/frankenphp |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.